/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dao.exceptions.NonexistentEntityException;
import dao.exceptions.PreexistingEntityException;
import java.util.List;

/**
 * Interface que deve ser usada por toda class DAO, para que o codigo se torne
 * flexivel.
 *
 * @author emersonmx
 * @since 0.1
 */
public interface DAO {

  /**
   * Insere um novo objecto no banco.
   *
   * @param o objeto a ser inserido.
   */
  public void inserir(Object o);

  /**
   * Altera um registro existente no banco.
   *
   * @param o objeto a ser alterado.
   * @throws NonexistentEntityException quando não for encontrado o registro
   * a ser alterado.
   * @throws Exception em caso de ocorrer qualquer outro tipo de erro.
   */
  public void alterar(Object o) throws NonexistentEntityException, Exception;

  /**
   * Exclui um registro do banco pelo id.
   *
   * @param id do registro a ser excluido.
   * @throws PreexistingEntityException quando um registro já existe no banco.
   * @throws NonexistentEntityException quando não for encontrado o registro
   * a ser alterado.
   */
  public void excluir(Long id) throws NonexistentEntityException;

  /**
   * Pesquisa todos os resultados possiveis.
   *
   * @return uma lista contendo todos os registros do banco, ou uma lista vazia.
   */
  public List pesquisar();

  /**
   * Pesquisa registro por campos.
   * OBS.: os campos que forem null devem ser ignorados.
   *
   * @param o objeto com os campos desejados a ser procurados.
   * @return uma lista contendo os registro com os campos especificados ou
   * uma lista vazia.
   */
  public List pesquisar(Object o);

  /**
   * Pesquisa uma quantidade especifica de registros.
   *
   * @param resultadosMaximo quantidade maxima de registros.
   * @param primeiroResultado indica quem será o primeiro resultado.
   * @return uma lista contendo os registros pesquisados no banco, ou uma
   * lista vazia.
   */
  public List pesquisar(int resultadosMaximo, int primeiroResultado);

  /**
   * Pesquisa uma quantidade especifica de registros.
   * 
   * @param tudo indica se quer pesquisar tudo ou não.
   * @param resultadosMaximo quantidade maxima de registros.
   * @param primeiroResultado indica quem será o primeiro resultado.
   * @return uma lista contendo os registros pesquisados no banco, ou uma
   * lista vazia.
   */
  public List pesquisar(boolean tudo, int resultadosMaximo, int primeiroResultado);

  /**
   * Pesquisa registros por id.
   *
   * @param id a ser procurado.
   * @return um objeto do registro, ou null caso contrario.
   */
  public Object pesquisar(Long id);

  /**
   * Conta a quantidade de registro no banco.
   *
   * @return a quantidade de registros.
   */
  public int contar();

  public boolean revogar(String a);

  public boolean numeroLeiUnica(String numeroLei);
}
